package com.huahua.utils;


import com.huahua.utils.entity.PropertyInfo;
import com.huahua.utils.util.JDBCUtil;
import com.huahua.utils.entity.TableInfo;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import javax.lang.model.element.VariableElement;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SuppressWarnings("all")
public class GenerateProjectTemplate {
    private static Configuration configuration=new Configuration();
    private static Template template;
    private static Writer out;

    private String templatePaht;

    public GenerateProjectTemplate(String templatePath) throws IOException {
        configuration.setDirectoryForTemplateLoading(new File(templatePath));
        configuration.setDefaultEncoding("utf-8");
    }


    public void generateMapper(String tableName,String packageName,String templateName,String filterPrefix,String outRootPath) throws IOException, TemplateException {


        template = configuration.getTemplate(templateName);

        // 创建一个模板使用的数据集，可以是pojo也可以是map。一般是Map。
        Map dataModel = new HashMap<>();
        String pojoUpName = getPojoUpName(tableName, filterPrefix);
        String pojoLowName = getPojoLowName(tableName, filterPrefix);

        //向数据集中添加数据
        dataModel.put("pojoNameBig", pojoUpName);
        dataModel.put("pojoNameLte",  pojoLowName);
        dataModel.put("packageName",packageName);

        // 创建一个Writer对象，一般创建一FileWriter对象，指定生成的文件名。
        out = getOut(packageName,outRootPath,pojoUpName,"Mapper.java");
        // 调用模板对象的process方法输出文件。
        template.process(dataModel, out);
        out.close();

    }


    public void generateServiceImpl(String tableName,String packageName,String templateName,String filterPrefix,String outRootPath) throws IOException, TemplateException {


        // 加载一个模板，创建一个模板对象。

        template = configuration.getTemplate(templateName);

        // 创建一个模板使用的数据集，可以是pojo也可以是map。一般是Map。
        Map dataModel = new HashMap<>();
        String pojoUpName = getPojoUpName(tableName, filterPrefix);
        String pojoLowName = getPojoLowName(tableName, filterPrefix);

        //向数据集中添加数据
        dataModel.put("pojoNameBig", pojoUpName);
        dataModel.put("pojoNameLte",  pojoLowName);
        dataModel.put("packageName",packageName);

        // 创建一个Writer对象，一般创建一FileWriter对象，指定生成的文件名。
        out = getOut(packageName,outRootPath,pojoUpName,"ServiceImpl.java");

        // 调用模板对象的process方法输出文件。
        template.process(dataModel, out);
        out.close();

    }


    public void generateService(String tableName,String packageName,String templateName,String filterPrefix,String outRootPath) throws IOException, TemplateException {


        // 加载一个模板，创建一个模板对象。
        template = configuration.getTemplate(templateName);

        // 创建一个模板使用的数据集，可以是pojo也可以是map。一般是Map。
        Map dataModel = new HashMap<>();
        String pojoUpName = getPojoUpName(tableName, filterPrefix);
        String pojoLowName = getPojoLowName(tableName, filterPrefix);

        //向数据集中添加数据
        dataModel.put("pojoNameBig", pojoUpName);
        dataModel.put("pojoNameLte",  pojoLowName);
        dataModel.put("packageName",packageName);

        // 创建一个Writer对象，一般创建一FileWriter对象，指定生成的文件名。
        out = getOut(packageName,outRootPath,pojoUpName,"Service.java");
        // 调用模板对象的process方法输出文件。
        template.process(dataModel, out);
        out.close();

    }


    public  void generateController(String tableName,String packageName,String templateName,String filterPrefix,String outRootPath) throws Exception {


        // 加载一个模板，创建一个模板对象。
        template = configuration.getTemplate(templateName);

        // 创建一个模板使用的数据集，可以是pojo也可以是map。一般是Map。
        Map dataModel = new HashMap<>();
        String pojoUpName = getPojoUpName(tableName, filterPrefix);
        String pojoLowName = getPojoLowName(tableName, filterPrefix);
        //向数据集中添加数据
        dataModel.put("pojoNameBig", pojoUpName);
        dataModel.put("pojoNameLte",  pojoLowName);
        dataModel.put("packageName",packageName);

        // 创建一个Writer对象，一般创建一FileWriter对象，指定生成的文件名。
        out = getOut(packageName,outRootPath,pojoUpName,"Controller.java");
        // 调用模板对象的process方法输出文件。
        template.process(dataModel, out);
        out.close();

    }


    public void generateAllPojo(String packageName,String templateName,String filterPrefix,String outRootPath) throws Exception {
        template = configuration.getTemplate(templateName);
        List<TableInfo> tableInfoList = JDBCUtil.getTableDetails();
        HashMap<String, Object> map = new HashMap<>();
        map.put("packageName",packageName);
        for (TableInfo tableInfo : tableInfoList) {
            String tableName = tableInfo.getTableName();
            map.put("tableName", tableName);
            List<PropertyInfo> propertyInfos = tableInfo.getProperties();
            map.put("properties",propertyInfos);
            String pojoName = getPojoUpName(tableName,filterPrefix);
            map.put("pojoName",pojoName);
           // out =new FileWriter(new File(getOutPath(packageName,outRootPath)+".java"));
            out=getOut(packageName,outRootPath,pojoName,".java");
            template.process(map,out);
            out.close();
        }
    }

    public Writer getOut(String packageName,String outRootPath,String fileName,String ext) throws IOException {
        String packagePath = packageName.replace(".", "/");
        String outPath = outRootPath+"/src/main/java/"+packagePath;
        File file = new File(outPath);
        file.mkdirs();

        return new FileWriter(new File(file,fileName+ext));

    }


    /**
     * 生成类名
     * @param tableName
     * @param filterPrefix 过滤前缀
     * @return
     */
    private String getPojoUpName(String tableName, String filterPrefix){
        String lowName = getPojoLowName(tableName, filterPrefix);
        String upName=lowName.substring(0,1).toUpperCase()+lowName.substring(1);
        return upName;
    }

    private String getPojoLowName(String tableName, String filterPrefix){
        String filterName = tableName.replaceFirst(filterPrefix,"");
        String lowName = JDBCUtil.getJavaName(filterName);
        return lowName;
    }



    public void test() throws Exception {
        //generateAllPojo("com.changgou.pojo","Pojo.ftl","tb_","E:/IdeaProjects/pojoCreate/pojo_template");
        List<TableInfo> tableDetails = JDBCUtil.getTableDetails();
        for (TableInfo tableInfo : tableDetails) {
            generateController(tableInfo.getTableName(),"com.changgou.goods.controller","Controller.ftl","tb_","E:/IdeaProjects/pojoCreate/pojo_template");
            generateServiceImpl(tableInfo.getTableName(),"com.changgou.goods.service.impl","ServiceImpl.ftl","tb_","E:/IdeaProjects/pojoCreate/pojo_template");
            generateService(tableInfo.getTableName(),"com.changgou.goods.service","Service.ftl","tb_","E:/IdeaProjects/pojoCreate/pojo_template");
            generateMapper(tableInfo.getTableName(),"com.changgou.goods.dao","Mapper.ftl","tb_","E:/IdeaProjects/pojoCreate/pojo_template");
        }
    }
}
